package com.mthree;

import java.util.*;

/**
 *  编程题
 *
 *  使用集合实现斗地主游戏的部分功能，要求如下：
 *
 *  （1）首先准备 54 张扑克牌并打乱顺序。
 *
 *  （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
 *
 *  （3）查看三个玩家手中的扑克牌和底牌。
 *
 *  （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
 *
 *     手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
 */
public class PlayCard {


    public static void main(String[] args) {

        //1.创建54张扑克牌
        List<String> cardList = Arrays.asList("大王", "小王",
                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
//        Arrays.asList实现数组类型到集合类型的转换
//        cardList = Arrays.asList("大王", "小王",
//                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
//                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
//                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
//                "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
        /*
        （1）首先准备 54 张扑克牌并打乱顺序。
        */
        //声明一个长度为54的一维数组，用于存储0-54的随机数
        int[] num=new int[54];
        //声明随机数对象
        Random random=new Random();
        //for循环用于实现将随机数赋值与num数组
        for (int i = 0; i < num.length; i++) {
            //将0-54的随机数赋值给num数组
            num[i] = random.nextInt(54);
            //使用for循环判断如果所产生的随机数中如果有重复的数据，则将i-1，重新给上一个下标生成随机数，直到不重复为止
            for (int j = 0; j < i; j++) {
                //判断所产生的随机数中是否存有重复数据
                if (num[i] == num[j]) {
                    //将i-1，重新给上一个下标生成随机数
                    i--;
                    break;
                }
            }

        }
        //打印随机数
//        for (int i=0;i<num.length;i++){
//            System.out.println(i+">>"+num[i]);
//        }
        //创建Queue队列对象，用于存储随机生成数所对应cardList下标上的元素
        Queue<String> queue=new LinkedList<>();
        //使用for循环遍历，依次将cardList集合中的元素插入到queue队列中
        for (int i=0;i<cardList.size();i++){
            //get()获取指定下标的参数
            String s = cardList.get(num[i]);
            //offer()从队列后向前插入元素
            queue.offer(s);
        }
        //使用for循环遍历queue队列
//        for (Object obj:queue) {
//            System.out.print(obj);
//        }
//        System.out.println();
        System.out.println();
        //创建玩家1，2，3list集合，用于保存17扑克牌
        List<String> player1=new LinkedList<>();
        List<String> player2=new LinkedList<>();
        List<String> player3=new LinkedList<>();
        //for循环，长度17，保留3张底牌，从queue队列中依次向player1，2，3中插入对象，这里使用poll为保证该元素插入到list中后删除，保证元素唯一性
        for (int i=0;i<17;i++){
            //poll从队首删除并返回一个元素
            //add向集合中添加对象
            player1.add(queue.poll());
            player2.add(queue.poll());
            player3.add(queue.poll());
        }
//        Collections.sort(player1);
//        Collections.sort(player2);
//        Collections.sort(player3);
        //排序前的扑克牌顺序
//        System.out.println("------------------------");
//        for (Object obj:player1) {
//            System.out.print(obj+"\t");
//        }
//        System.out.println();
//        System.out.println("------------------------");
//        for (Object obj:player2) {
//            System.out.print(obj+"\t");
//        }
//        System.out.println();
//        System.out.println("------------------------");
//        for (Object obj:player3) {
//            System.out.print(obj+"\t");
//        }
        System.out.println();

        //定义一个从大王到3顺序的集合
        List<String> list = Arrays.asList("大王", "小王", "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
        //声明一个一维数组，用于存储list对应元素的下标索引
        int[] str=new int[17];
        int[] str1=new int[17];
        int[] str2=new int[17];
        //for循环，获取到player1中的元素，使用indexof查询到对应list中的元素下标索引，并且赋值到str数组中
        for (int i=0;i<player1.size();i++){
            //String s = player1.get(i);
            //int i1 = list.indexOf(player1.get(i));
            str[i]=list.indexOf(player1.get(i));
        }
        //for循环，获取到player2中的元素，使用indexof查询到对应list中的元素下标索引，并且赋值到str数组中
        for (int i=0;i<player2.size();i++){
            str1[i]=list.indexOf(player2.get(i));
        }
        //for循环，获取到player3中的元素，使用indexof查询到对应list中的元素下标索引，并且赋值到str数组中
        for (int i=0;i<player3.size();i++){
            str2[i]=list.indexOf(player3.get(i));
        }
        //一维数组排序前
//        System.out.println("================");
//        for (int i=0;i<str.length;i++){
//            System.out.print(str[i]+"\t");
//        }
        System.out.println();
        //对移位数组中的元素进行排序，排序后的结果，就是list中元素对象下标的顺序
        Arrays.sort(str);
        Arrays.sort(str1);
        Arrays.sort(str2);
        //将集合中所有的元素清空
        player1.clear();
        player2.clear();
        player3.clear();
        //一维数组排序后，for循环遍历
//        for (int i=0;i<str.length;i++){
//            System.out.print(str[i]+"\t");
//        }
        System.out.println();
        //使用for循环，根据获取str一维数组中的元素，得到对应cardList集合中的元素，并且添加到player1集合中
        for (int i=0;i<17;i++){
            //System.out.print(str[i]+"\t");
            //String s = cardList.get(str[i]);
            player1.add(cardList.get(str[i]));
        }
        //使用for循环，根据获取str1一维数组中的元素，得到对应cardList集合中的元素，并且添加到player2集合中
        for (int i=0;i<17;i++){
            player2.add(cardList.get(str1[i]));
        }
        //使用for循环，根据获取str2一维数组中的元素，得到对应cardList集合中的元素，并且添加到player3集合中
        for (int i=0;i<17;i++){
            player3.add(cardList.get(str2[i]));
        }
        System.out.println();
        //for each 遍历
        for (Object obj:player1) {
            System.out.print(obj+"\t");
        }
        System.out.println();
        //for each 遍历
        for (Object obj:player2) {
            System.out.print(obj+"\t");
        }
        System.out.println();
        //for each 遍历
        for (Object obj:player3) {
            System.out.print(obj+"\t");
        }

//        Arrays.asList(player1);
//        Collections.sort();


    }


}
